/**
 * 统一API响应格式工具
 */

/**
 * 成功响应
 * @param {Object} res - Express响应对象  
 * @param {*} data - 响应数据
 * @param {string} message - 响应消息
 * @param {number} code - 状态码
 */
const success = (res, data = null, message = '操作成功', code = 200) => {
  const response = {
    success: true,
    code,
    message,
    timestamp: new Date().toISOString()
  };

  if (data !== null) {
    response.data = data;
  }

  return res.status(code).json(response);
};

/**
 * 错误响应
 * @param {Object} res - Express响应对象
 * @param {string} message - 错误消息
 * @param {number} code - 状态码
 * @param {*} details - 错误详情
 */
const error = (res, message = '操作失败', code = 400, details = null) => {
  const response = {
    success: false,
    code,
    message,
    timestamp: new Date().toISOString()
  };

  if (details !== null) {
    response.details = details;
  }

  return res.status(code).json(response);
};

/**
 * 分页响应
 * @param {Object} res - Express响应对象
 * @param {Array} data - 数据列表
 * @param {Object} pagination - 分页信息
 * @param {string} message - 响应消息
 */
const paginate = (res, data, pagination, message = '获取成功') => {
  return success(res, {
    list: data,
    pagination: {
      page: pagination.page,
      pageSize: pagination.pageSize,
      total: pagination.total,
      totalPages: Math.ceil(pagination.total / pagination.pageSize),
      hasNext: pagination.page < Math.ceil(pagination.total / pagination.pageSize),
      hasPrev: pagination.page > 1
    }
  }, message);
};

/**
 * 服务器错误响应
 * @param {Object} res - Express响应对象
 * @param {Error} err - 错误对象
 */
const serverError = (res, err = null) => {
  console.error('服务器错误:', err);
  
  const response = {
    success: false,
    code: 500,
    message: '服务器内部错误',
    timestamp: new Date().toISOString()
  };

  // 开发环境返回错误详情
  if (process.env.NODE_ENV === 'development' && err) {
    response.details = {
      message: err.message,
      stack: err.stack
    };
  }

  return res.status(500).json(response);
};

/**
 * 未授权响应
 * @param {Object} res - Express响应对象
 * @param {string} message - 错误消息
 */
const unauthorized = (res, message = '未授权访问') => {
  return error(res, message, 401);
};

/**
 * 禁止访问响应
 * @param {Object} res - Express响应对象
 * @param {string} message - 错误消息
 */
const forbidden = (res, message = '禁止访问') => {
  return error(res, message, 403);
};

/**
 * 资源未找到响应
 * @param {Object} res - Express响应对象
 * @param {string} message - 错误消息
 */
const notFound = (res, message = '资源未找到') => {
  return error(res, message, 404);
};

/**
 * 请求冲突响应
 * @param {Object} res - Express响应对象
 * @param {string} message - 错误消息
 */
const conflict = (res, message = '请求冲突') => {
  return error(res, message, 409);
};

/**
 * 请求验证失败响应
 * @param {Object} res - Express响应对象
 * @param {string} message - 错误消息
 * @param {*} details - 验证错误详情
 */
const validationError = (res, message = '请求参数验证失败', details = null) => {
  return error(res, message, 422, details);
};

module.exports = {
  success,
  error,
  paginate,
  serverError,
  unauthorized,
  forbidden,
  notFound,
  conflict,
  validationError
}; 